package com.itheima.d1_create_thread;

import com.itheima.d2_thread_api.ThreadDemo1;

/*
    多线程的创建方式二：实现Runnable接口

    实现步骤
        1 定义一个线程任务类MyRunnable实现Runnable接口，重写run()方法
        2 创建MyRunnable任务对象
        3 把MyRunnable任务对象交给Thread处理。
        4 调用线程对象的start()方法启动线程

    方式二的优缺点
        优点：任务类只是实现接口，可以继续继承其他类、实现其他接口，扩展性强。
        缺点：需要多一个Runnable对象。
 */
public class ThreadDemo2 {
    public static void main(String[] args) {
        // 3 创建任务类对象

        MyRunnable runnable = new MyRunnable();
        // 4 创建一个线程(Thread类)对象 , 把任务类的对象作为构造方法的参数传递
        Thread thread = new Thread(runnable);
        // 5 开启线程
        thread.start();

        // 4 创建一个线程(Thread类)对象 , 把任务类的对象作为构造方法的参数传递
        Thread thread2 = new Thread(runnable);
        // 5 开启线程
        thread2.start();

        Demo2 demo2 = new Demo2();
        Thread thread3 = new Thread(demo2);
        thread3.start();
        // main线程中定义任务
        for (int i = 1; i <= 10; i++) {
            System.out.println("main线程中打印数据:" + i);
        }

        //---匿名内部类----

        Thread thread4 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {

                    System.out.println("匿名内部类 的线程开始运行了" + i);
                }
            }
        });
        thread4.start();

        Thread thread5 = new Thread(() -> {
            System.out.println("匿名Lambda");
        });
        thread5.start();

    }
}

// 1 自定义一个类实现Runnable接口
// 任务类
class MyRunnable implements Runnable {
    // 2 重写接口中的抽象run方法
    @Override
    public void run() {
        for (int i = 1; i <= 10; i++) {
            System.out.println("新线程打印数据:" + i);
        }
    }
}

class Demo2 implements Runnable {

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("子线程在测试   ");
            System.out.print(i);
        }

    }
}


